<?php
namespace core;

require_once 'functions.php';


class App {
    public function __construct($argv) {
        $this->setEnv();
        $mod = $this->parse($argv);
        $this->start($mod);
    }


    // php 环境配置
    private function setEnv() {
        // 去除 警告、通知 等输出
        error_reporting(E_ALL ^ E_WARNING ^ E_NOTICE ^ E_STRICT ^ E_DEPRECATED);

        // 确认日志目录存在
        path_sure(PATH_LOG);

        if (APP_DEBUG) {
            ini_set('display_errors','On'); //调试模式网页显示错误信息

            $whoops = new \Whoops\Run();
            // 命令行模式
            if ('cli' === PHP_SAPI) {
                $whoops->pushHandler(new \Whoops\Handler\PlainTextHandler());
            } else {
                $whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler());
            }
            $whoops->register();
        } else {
            ini_set('display_errors','Off'); //线上模式网页不显示错误信息
            ini_set('log_errors', 'On'); //记录错误日志
            ini_set('error_log', PATH_LOG . 'php_errors.log'); //错误日志文件路径
        }
        ini_set('date.timezone','Asia/Shanghai'); //设置时区
    }

    // 解析参数
    private function parse($argv) {
        // cli 命令行模式(php public/index.php app/controller/method)
        if ('cli' === PHP_SAPI) {
            $mod = url_to_mod('/' . $argv[1]);
        } else {
            $uri = url_original($_SERVER['REQUEST_URI']);
            $mod = url_to_mod($uri);
        }

        return $mod;
    }

// 拼接控制器和函数并运行
    function start($mod) {
        // 检查是否设置了默认 应用、控制器、方法
        defined('DEFAULT_APP') or define('DEFAULT_APP', 'home');
        defined('DEFAULT_CONTROLLER') or define('DEFAULT_CONTROLLER', 'Index');
        defined('DEFAULT_METHOD') or define('DEFAULT_METHOD', 'index');

        if (empty($mod) || !is_array($mod)) {
            // cli 命令行模式
            if ('cli' === PHP_SAPI) {
                echo 'run as: php public/index.php app/controller/method';
            } else {
                header('Location:' . uri_full() . '/' . DEFAULT_APP . '/' . DEFAULT_CONTROLLER . '/' . DEFAULT_METHOD);
            }
            exit();
        }

        $method = null;
        if ($mod[1]) {
            $app        = $mod[0];
            $controller = $mod[1];
            $filename   = PATH_APP . $app . '/controller/' . $controller . '.php';
            if (file_exists($filename)) {
                if ($mod[2]) $method = $mod[2];
            } else {
                $controller = DEFAULT_CONTROLLER;
                $method     = $mod[1];
            }
        } else {
            $app        = $mod[0];
            $controller = DEFAULT_CONTROLLER;
            $method     = DEFAULT_METHOD;
        }

        define('APP',       $app);
        define('CONTROLLER',$controller);

        // 自动加载全局文件
        $autoloadFile = PATH_APP . 'autoload.php';
        if (file_exists($autoloadFile)) {
            require_once $autoloadFile;
        }
        // 自动加载应用文件
        $appAutoloadFile = PATH_APP . $app . '/autoload.php';
        if (file_exists($appAutoloadFile)) {
            require_once $appAutoloadFile;
        }

        // 模板目录
        defined('PATH_VIEW') or define('PATH_VIEW', PATH_APP . $app . '/view/');

        // 控制器类文件名大写
        $controllerFile = ucfirst($controller);
        $module = "app\\{$app}\\controller\\{$controllerFile}";
        new $module($method);
    }
}
